/**
 * 两个人给定初始位置，位置用一个坐标表示
 * 然后再给定一系列位置Ai
 * 要求将A分为两个序列，两个人分别依次移动到每个位置
 * 问如何划分，使得两个人的距离最小。
 * 距离定义为全过程中坐标差的最大绝对值
 * 所有坐标各不相同。
 * 
 * 考虑二分答案
 * 首先最小可能的答案肯定是初始坐标差。最大可能答案直接定1E9即可。
 * 再考虑如何check，假设当前check的是mid
 * 对每个ai，其实不必考虑具体分给了谁，无论分给了谁，
 * 必须存在一些符合条件的坐标以分配给另一个人
 * 
 * 用一个set保存之前"所有的"坐标
 * for ai in A:
 *     将set中所有与ai距离超过mid的全都删除
 *     这些坐标必须和ai一起分配给同一个人
 *     如果set为空，说明另一个人分不到位置，false
 *     将ai放入set
 *     ai是刚才删掉坐标的代表，表示分配给某个人
 * 因此set中保存的坐标其实就是没有互斥的坐标值
 * 也就是这些坐标随便分成两份，均能满足条件
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using Real = double;
using vi = vector<int>;
using pii = pair<int, int>;

int N, X, Y;
vi A;

bool check(int limit){
    set<int> s;
    s.insert(X); s.insert(Y);
    for(auto i : A){
        while(not s.empty() and abs(*s.begin() - i) > limit) s.erase(s.begin());
        while(not s.empty() and abs(*s.rbegin() - i) > limit) s.erase(--s.end());
        if(s.empty()) return false;
        s.insert(i);
    }
    return true;
}

int proc(){
    int left = Y - X;
    if(left < 0) left = -left;

    int right = 1E9;
    int mid;
    do{
        mid = (left + right) >> 1;
        if(check(mid)) right = mid - 1;
        else left = mid + 1;
    }while(left <= right);
    // cout << left << ", " << right << endl;
    return left;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> N >> X >> Y;
        A.assign(N, {});
        for(auto & i : A) cin >> i;
        cout << proc() << "\n";
    }
    return 0;
}